﻿using Mjolnir.InfraEstrutura.Servicos;

namespace Mjolnir.Modelo.Matrizes
{
  public class ServicoMatriz2x2 : ServicoBase<Matriz2x2>, IServicoMatriz<Matriz2x2>
  {
    /// <summary>
    /// Setar o valor.
    /// </summary>
    /// <param name="valor">valor.</param>
    public void setarValor(double[] valor)
    {
      entidade.M00 = valor[0];
      entidade.M01 = valor[1];
      entidade.M10 = valor[2];
      entidade.M11 = valor[3];
    }

    public void setarValor(Matriz2x2 valor)
    {
      entidade.M00 = valor.M00;
      entidade.M01 = valor.M01;
      entidade.M10 = valor.M10;
      entidade.M11 = valor.M11;
    }

    public void obterValor(ref double[] valor)
    {
      valor[0] = entidade.M00;
      valor[1] = entidade.M01;
      valor[2] = entidade.M10;
      valor[3] = entidade.M11;
    }

    public bool Inverso(Matriz2x2 fonte)
    {
      double a11 = fonte.M00;
      double a12 = fonte.M01;
      double a21 = fonte.M10;
      double a22 = fonte.M11;

      double determinante = a11 * a22 - a12 * a21;

      if (determinante == 0)
        return false;

      determinante = 1 / determinante;

      entidade.M00 = a22 * determinante;
      entidade.M01 = - a12 * determinante;
      entidade.M10 = - a21 * determinante;
      entidade.M11 = a11 * determinante;

      return true;
    }
  }
}
